package com.my.fss.common.util;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.*;

public class FileUtil {

	/** 常量 */
	private static final int BUFFER_SIZE = 2*1024;

	protected static Log logger = LogFactory.getLog(FileUtil.class);


	/**
	 * 创建文本文件
	 * @param filePath	文本文件的地址
	 */
	public static File createTextFile(String filePath) throws Exception {

		File file = new File(filePath);
		if(file.exists()) {
			return file;
		}

		createFileDir(filePath);
		file.createNewFile();
		return file;
	}


	/**
	 * 读取文本文件
	 * @param filePath	文本文件的地址
	 * @return			文本内的字符串
	 */
	public static String readTextFile(String filePath) throws Exception {

		File file = new File(filePath);

		InputStream is = null;
		try {
			is = new FileInputStream(file);
			byte[] b = new byte[(int)file.length()];
			int len = 0;
			int temp = 0;
			while((temp=is.read()) != -1){
		       b[len]=(byte)temp;
		       len++;
			}
			return new String(b, 0, len, "utf-8");
		}
		finally {
			if(is != null) {
				is.close();
			}
		}
	}


	/**
	 * 快速读取文本文件
	 * @param filePath	文本文件的地址
	 * @return			文本内的字符串
	 */
	public static String fastReadTextFile(String filePath) throws Exception {

		File file = new File(filePath);

		InputStream is = null;
		try {
			is = new FileInputStream(file);
			byte[] b = new byte[1024];
			int len = 0;
			StringBuffer sb = new StringBuffer();
			while((len=is.read(b)) != -1) {
				sb.append(new String(b, 0, len, "utf-8"));
			}
			return sb.toString();
		}
		finally {
			if(is != null) {
				is.close();
			}
		}
	}


	/**
	 * 重命名文件
	 * 如果新命名的文件存在，则覆盖
	 * @param file			源文件
	 * @param newFileName	新文件名
	 * @return				true	成功
	 * 						false 	失败
	 */
	public static boolean renameFile(File file, String newFileName) {

		if(!file.exists()) {
			return false;
		}

		File newFile = new File(file.getParent() + File.separator + newFileName);
		if(newFile.exists() && newFile.delete()==false) {
			return false;
		}

		return file.renameTo(newFile);
	}


	/**
	 * 复制单个文件
	 *
	 * @param origFile 		待复制的文件
     * @param toFilePath	目标文件名
     * @param overlay		如果目标文件存在，是否覆盖
     * @return 				如果复制成功返回true，否则返回false
	 */
	public static boolean copyFile(File origFile, String toFilePath,
            											boolean overlay) {
        // 判断源文件是否存在
        if(!origFile.exists()) {
        	logger.warn("原始文件不存在："+origFile.getPath());
            return false;
        }
        // 判断源文件是否是文件
        if(!origFile.isFile()) {
        	logger.warn("原始文件不是一个文件："+origFile.getPath());
            return false;
        }

        // 判断目标文件是否存在
        // 如果存在并需要覆盖，则将原文件删除；如果不需要覆盖，则直接返回true
        // 如果不存在，则创建所需的目录
        File toFile = new File(toFilePath);
        if(toFile.exists()) {
            if(overlay) {
                new File(toFilePath).delete();
            }
            else {
            	return true;
            }
        }
        else {
            if(!toFile.getParentFile().exists()) {
                if(!toFile.getParentFile().mkdirs()) {
                    return false;
                }
            }
        }

        // 开始复制文件
        int byteread = 0; // 读取的字节数
        InputStream in = null;
        OutputStream out = null;

        try {
            in = new FileInputStream(origFile);
            out = new FileOutputStream(toFile);
            byte[] buffer = new byte[BUFFER_SIZE];

            while ((byteread = in.read(buffer)) != -1) {
                out.write(buffer, 0, byteread);
            }
            return true;
        }
        catch (IOException e) {
        	logger.error(e);
        	return false;
        }
        finally {
            try {
            	if(in != null) {
            		in.close();
            	}
            	if(out != null) {
            		out.close();
            	}
            }
            catch (IOException e) {
                logger.error(e);
            }
        }
    }


	/**
	 * 创建保存文件的目录
	 * @param filePath
	 */
	public static void createFileDir(String filePath) {

		filePath = filePath.replaceAll("\\\\", "/");
        File dir = new File(filePath.substring(0, filePath.lastIndexOf("/")));
        if(!dir.exists()) {
        	dir.mkdirs();
        }

	}
	/**
	 * 创建文件的目录
	 * @param dirPath
	 */
	public static void createDir(String dirPath) {

        File dir = new File(dirPath);
        if(!dir.exists()) {
        	dir.mkdirs();
        }

	}


	/**
	 * Byte转File
	 * @param buf
	 * @param filePath
	 * @param fileName
	 */
	public static void byte2File(byte[] buf, String filePath, String fileName) {
        BufferedOutputStream bos = null;
        FileOutputStream fos = null;
        File file = null;
        try
        {
            File dir = new File(filePath);
            if (!dir.exists() && dir.isDirectory())
            {
                dir.mkdirs();
            }
            file = new File(filePath + File.separator + fileName);
            fos = new FileOutputStream(file);
            bos = new BufferedOutputStream(fos);
            bos.write(buf);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (bos != null)
            {
                try
                {
                    bos.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
            if (fos != null)
            {
                try
                {
                    fos.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
	
}